package com.lanou3g.code0510.reflection;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

/**
 * Created by dllo on 18/5/10.
 */
//本页也要证明的是通过反射向泛型为Person类型的数组里,加入String类型的字符串,证明了两点
//1.泛型在只在编译期生效,在程序运行时期,会统一擦除成Object,就跟没有一样,在编译期是为了限制类型
//2.可以通过反射向泛型约束的数组里加入不同类的东西,但是不会破坏数组里的原始结构
public class Test04 {
    public static void main(String[] args) throws Exception {
        List<Person> personList = new ArrayList<>();
        personList.add(new Person());//将Person对象放入到personList中
        //personList.add("String");
        //反射第一步,获取类类型,第三种反射方法
        Class clazz = personList.getClass();
        //通过反射,获取一个类中的方法
        //第一个参数表示方法名,后面的所有参数,需要传递你要获取的方法的参数类类型
        Method method = clazz.getDeclaredMethod("add", Object.class);
        //Object.class,其实是确定,你要获取的方法的参数类型,因为在一个类中可能有重名的方法(重载),这时
        //就需要Object.class,来区分是哪个方法了
        method.setAccessible(true);//如果是public方法,这行代码可以省略,否则需要加上这行方法
        method.invoke(personList, "Stringssss");
        //method.invoke,invoke为调用的意思,method为方法的意思,personList和"String"分别表示调用的对象及参数
        System.out.println(personList.size());
        //通过反射成功将String类型的数据放入了Person泛型的List中
        //证明了泛型只在编译期生效,在程序运行时期,会统一擦除成Object
        Object s = personList.get(1);//因为第一位为String类,所以得是Object类,不能为Person类
        System.out.println(s);

    }
}
